/*
 * camera_process.h
 *
 *  Created on: 2023.2.21
 *      Author: Lw
 */

#ifndef SRC_CAMERA_CAMERA_PROCESS_H_
#define SRC_CAMERA_CAMERA_PROCESS_H_

#include "xil_types.h"

/*************************************************************************
*                           全局变量 \ 引用
*************************************************************************/
#define CAMERA_ONE 1
#define CAMERA_TWO 2

enum
{
	DISCONNECT_COMMAND = 1,
	CONNECT_COMMAND,
	A0_COMMMAND,
	D2_COMMAND,
	D504_COMMAND,
	A3_COMMAND,
	A4_COMMAND,
	A7_COMMAND,
	A8_COMMAND,
	B3_COMMAND,
	CONNECT_COMMAND1,
	CONNECT_COMMAND2,
	B901_COMMAND,
	B902_COMMAND,
	B910_COMMAND,
	B911_COMMAND,
	B912_COMMAND,
	B913_COMMAND,
	B914_COMMAND,
	A1_COMMAND
}E_CAMERA_COMMAND;


enum E_CAMERA_SHOOT
{
    WAIT_SHOOT = 0,
    BEGIN_SHOOT,
    BURST_SETIDLE,
    BURST_RELEASEIDLE,
};

typedef struct{
    u32 TimeS;
    u16 TimeMs;
}S_UTCTime;


#define CAMERA_OPEN  0x00
#define CAMERA_CLOSE 0x01
#define CAMERA_WAIT  0xFF

typedef struct
{
	/* 曝光时间， MSB:byte3, LSB:byte0 */
	u8 ucExposureTime[4];

	/* 增益， Analog Gain  byte0=MSB byte1=LSB， Digital Gain R byte2=MSB byte3=LSB */
	u8 ucGain[2];

	u8 ucAnaGain[2];

	/* Extend增益， byte0=MSB byte1=LSB */
	u8 ucGainExtend[2];

	/* HGC\LGC，  byte0=MSB byte1=LSB */
	u8 ucGainHLGC[2];

	/* 图像位数, 0:8bit, 1:16bit */
	u8 ucPicBit;

	/* R offset， OFFSET1 R byte0=MSB byte1=LSB， OFFSET2 R  byte2=MSB byte3=LSB */
	u8 ucOffsetR[4];

	/* G offset， OFFSET1 G byte0=MSB byte1=LSB， OFFSET2 G  byte2=MSB byte3=LSB */
	u8 ucOffsetG[4];

	/* B offset， OFFSET1 B byte0=MSB byte1=LSB， OFFSET2 B  byte2=MSB byte3=LSB */
	u8 ucOffsetB[4];

	/* CL 测试图像配置, 0:正常模式, 1:固定序列LVDS, 2：渐变测试图像  */
	u8 ucClPicSet;
	/*保存第一次发送开始拍照指令时间*/
	u32 beginShootTimeS;
	u32 beginShootTimeMs;

	/* CL 模式选择, 0:FULL模式, 1:MEDIUM */
	u8 ucClPicMode;
	u8 status;
	u8 shootCount;

    /* 像素坏点Mask重置标志 */
    u8 PixelMaskRstFlag;
    /*根据曝光时间以及连拍间隔时间计算两张图片间隔时间 ms*/
    u16 shootIntervalTimeMs;
    /*连拍持续时间 ms*/
    u32 shootDuringTimeMs;
    u8 shootSetIdleFlag;
    u8 commandTrig;
} CameraSetting;


typedef struct
{
	/* 当前的速度设置，对于CMOS相机通常返回值为CMOS主频，对于CCD相机，返回为CCD芯片主频，0为低于1M， 1位1M 2为2M */
	u8 ucSpeedSet;

	/*
	 * 温度类型标识。0=支持摄氏度读出 1=支持ADU单位读出 2=支持两者。 如果支持ADU单位读出的，在CSI13..14
	 * CSI15..16输出，如果支持摄氏度的，在CSI22..23 CSI24..25读出
	 */
	u8 ucTemperatureSet;

	/* 当前温度（以0.1度为单位） */
	u8 uacCurrentTemp[2];

	/* 目标温度（以0.1度为单位） */
	u8 uacTargetTemp[2];

	/* 当前PWM值 */
	u8 ucCurrentPWM;

	/* 当前温控模式,1=自动 0=手动  */
	u8 ucCurrentTempMode;

	/* CMOS图像X尺寸 */
	u8 uacCmosXSize[2];

	/* CMOS图像Y尺寸 */
	u8 uacCmosYSize[2];

	/* 输出图像位数, 1为16bit，0为8bit */
	u8 ucPicBit;

	/* 相机子型号  */
	u8 ucCamModel;

	/* 图像颜色, 0:mono 1:RGB 2:CMYG 3:RGBW  */
	u8 ucCamColor;

	/* 相机序列号  */
	u8 ucCamSerialNum[16];
}CameraStatus;

CameraSetting	g_sCamera1Setting;
CameraSetting   g_sCamera2Setting;
CameraStatus	g_sCameraStatus;
enum E_CAMERA_SHOOT  Camera1ShootState;
enum E_CAMERA_SHOOT  Camera2ShootState;
volatile S_UTCTime s_tUTCTime;
/*************************************************************************
*                               宏定义
*************************************************************************/



/*************************************************************************
*                              函数引用
*************************************************************************/

extern void SendCommandToCarema(int iCommandNum);
void CameraProcessUpdate(void);
extern void CameraCommandRecv(int iCameraNum, u8 *puacCameraMsg);

extern void CameraCommandSend(u8 ucPlUartNum, u8 ucCommand);

extern u8 CameraParaInit(u8 ucPlUartNum);
u8 OpenCamera(u8 ucPlUartNum);
u8 CloseCamera(u8 ucPlUartNum);
void CameraBurstShootProcess(void);
void updataUTCtime(void);
#endif /* SRC_CAMERA_CAMERA_PROCESS_H_ */
